์๋ฐ์คํฌ๋ฆฝํธ ํด๋ฆฌํ์ ์ธ๊ณ๋ฅผ ํํํ๊ณ , ๊ทธ ๋ชฉ์ ๊ณผ ๊ฐ๋ฐ ๊ธฐ๋ฒ์ ์ดํดํ์ฌ ์ ์ธ๊ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ๋ฐ ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ์ ๋ณด์ฅํ์ธ์.
์น ํ๋ซํผ ํธํ์ฑ: ์๋ฐ์คํฌ๋ฆฝํธ ํด๋ฆฌํ ๊ฐ๋ฐ ์ข ํฉ ๊ฐ์ด๋
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ๋ฐ ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ต์ ๋ธ๋ผ์ฐ์ ๋ค์ ์น ํ์ค์ ์ค์ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ์ง๋ง, ๊ตฌํ์ด๊ฑฐ๋ ๋ ๋ฐ์ ๋ ๋ธ๋ผ์ฐ์ ๋ค์ ํน์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ ์ ์์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ํด๋ฆฌํ์ด ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ํด๋ฆฌํ์ ์ต์ ์ฝ๋๊ฐ ๋ค์ํ ํ๊ฒฝ์์ ์ํํ๊ฒ ์คํ๋ ์ ์๋๋ก ํ๋ ์ค์ํ ๋ค๋ฆฌ ์ญํ ์ ํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ ํด๋ฆฌํ ๊ฐ๋ฐ์ ๋ณต์กํ ์ธก๋ฉด์ ๊น์ด ํ๊ณ ๋ค์ด, ๊ฒฌ๊ณ ํ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ํธํ๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ํ์ํ ์ง์๊ณผ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํด๋ฆฌํ์ด๋ ๋ฌด์์ธ๊ฐ?
ํด๋ฆฌํ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฝ๋ ์กฐ๊ฐ(๋ณดํต ์๋ฐ์คํฌ๋ฆฝํธ)์ ๋๋ค. ๋ณธ์ง์ ์ผ๋ก, ํด๋ฆฌํ์ ๊ธฐ์กด ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋๋ฝ๋ ๊ธฐ๋ฅ์ ๊ตฌํํจ์ผ๋ก์จ '๊ณต๋ฐฑ์ ๋ฉ์ฐ๋' ์ฝ๋ ์ค๋ํซ์ ๋๋ค. 'ํด๋ฆฌํ'์ด๋ผ๋ ์ฉ์ด๋ ๊ตฌ๋ฉ์ ๋ฉ์ฐ๋ ์ ํ(์: Polyfilla)์์ ์ฐจ์ฉ๋์์ต๋๋ค. ์น ๊ฐ๋ฐ์์ ํด๋ฆฌํ์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์ ๋๋ฝ๋ ๊ธฐ๋ฅ์ ํด๊ฒฐํ์ฌ ๊ฐ๋ฐ์๊ฐ ๊ตฌํ ์์คํ ์ฌ์ฉ์๋ฅผ ์์ธ์ํค์ง ์๊ณ ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
์ด๋ ๊ฒ ์๊ฐํด ๋ณด์ธ์: ์น์ฌ์ดํธ์ ์๋กญ๊ณ ๋ฉ์ง ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ถ์ง๋ง, ์ผ๋ถ ์ฌ์ฉ์๋ ์ฌ์ ํ ํด๋น ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํด๋ฆฌํ์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ก์ด ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฒ์ญ๊ธฐ์ ๊ฐ์์, ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ํ๊ณผ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
ํด๋ฆฌํ vs. ์ฌ(Shim)
'ํด๋ฆฌํ'๊ณผ '์ฌ'์ด๋ผ๋ ์ฉ์ด๋ ์ข ์ข ํผ์ฉ๋์ง๋ง, ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋ ๋ค ํธํ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง, ํด๋ฆฌํ์ ํนํ ๋๋ฝ๋ ๊ธฐ๋ฅ์ ์ ํํ ๋์์ ๋ณต์ ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ๋ฐ๋ฉด, ์ฌ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋์ ํธํ์ฑ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด๋ ๋์ฒด๋ฌผ์ ์ ๊ณตํฉ๋๋ค. ํด๋ฆฌํ์ ์ฌ์ ํ ์ข ๋ฅ์ด์ง๋ง, ๋ชจ๋ ์ฌ์ด ํด๋ฆฌํ์ ์๋๋๋ค.
์๋ฅผ ๋ค์ด, Array.prototype.forEach ๋ฉ์๋์ ๋ํ ํด๋ฆฌํ์ ECMAScript ์ฌ์์ ์ ์๋ ๋๋ก ์ ํํ ๊ธฐ๋ฅ์ ๊ตฌํํฉ๋๋ค. ๋ฐ๋ฉด์ ์ฌ์ forEach์ ๋์์ ์๋ฒฝํ๊ฒ ๋ณต์ ํ์ง ์๋๋ผ๋ ๋ฐฐ์ด๊ณผ ์ ์ฌํ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ๊ธฐ ์ํ ๋ ์ผ๋ฐ์ ์ธ ํด๊ฒฐ์ฑ
์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ ํด๋ฆฌํ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
ํด๋ฆฌํ์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ด ์์ต๋๋ค:
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ๋ธ๋ผ์ฐ์ ์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋๊ณ ๊ธฐ๋ฅ์ ์ธ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค. ์ฌ์ฉ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ต์ ๋ชจ๋ธ์ด ์๋๋๋ผ๋ ์์ ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ต์ ์ฝ๋ ์ฌ์ฉ: ๊ฐ๋ฐ์๊ฐ ํธํ์ฑ์ ํฌ์ํ์ง ์๊ณ ๋ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ๊ณผ API๋ฅผ ํ์ฉํ ์ ์๊ฒ ํฉ๋๋ค. ๊ฐ์ฅ ๋ฎ์ ์ฌ์์ ๋ธ๋ผ์ฐ์ ์ ๋ง์ถฐ ์ฝ๋๋ฅผ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค.
- ๋ฏธ๋ ๋๋น: ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ๊ณ์ ์๋ํ ๊ฒ์ด๋ผ๋ ํ์ ์ ๊ฐ์ง๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง์ ์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ ๋น์ฉ ์ ๊ฐ: ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์ ๋ํด ๋ณ๋์ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์์ฑํ ํ์๊ฐ ์์ด ๊ฐ๋ฐ ๋ฐ ์ ์ง๋ณด์๊ฐ ๋จ์ํ๋ฉ๋๋ค. ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ์ํ ๋จ์ผ ์ฝ๋ ๋ฒ ์ด์ค์ ๋๋ค.
- ์ฝ๋ ์ ์ง๋ณด์์ฑ ํฅ์: ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ ๊นจ๋ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ์ฅ๋ คํฉ๋๋ค.
๊ธฐ๋ฅ ๊ฐ์ง: ํด๋ฆฌํ๋ง์ ๊ธฐ์ด
ํด๋ฆฌํ์ ์ ์ฉํ๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ์ ์ค์ ๋ก ํด๋ฆฌํ์ด ํ์ํ์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ๋ ๊ธฐ๋ฅ ๊ฐ์ง๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ฅ ๊ฐ์ง๋ ํน์ ๊ธฐ๋ฅ์ด๋ API๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๋์ง ํ์ธํ๋ ๊ณผ์ ์ ๋๋ค. ์ง์๋์ง ์์ผ๋ฉด ํด๋ฆฌํ์ด ์ ์ฉ๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ๊ตฌํ์ด ์ฌ์ฉ๋ฉ๋๋ค.
๊ธฐ๋ฅ ๊ฐ์ง ๊ตฌํ ๋ฐฉ๋ฒ
๊ธฐ๋ฅ ๊ฐ์ง๋ ์ผ๋ฐ์ ์ผ๋ก ์กฐ๊ฑด๋ฌธ๊ณผ typeof ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ ์ญ ๊ฐ์ฒด์ ์์ฑ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ๊ตฌํ๋ฉ๋๋ค.
์์: Array.prototype.forEach ๊ฐ์งํ๊ธฐ
๋ค์์ Array.prototype.forEach ๋ฉ์๋๊ฐ ์ง์๋๋์ง ๊ฐ์งํ๋ ๋ฐฉ๋ฒ์
๋๋ค:
if (!Array.prototype.forEach) {
// forEach๋ฅผ ์ํ ํด๋ฆฌํ
Array.prototype.forEach = function(callback, thisArg) {
// ํด๋ฆฌํ ๊ตฌํ
// ...
};
}
์ด ์ฝ๋ ์ค๋ํซ์ ๋จผ์ Array.prototype.forEach๊ฐ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค. ์กด์ฌํ์ง ์์ผ๋ฉด ํด๋ฆฌํ ๊ตฌํ์ด ์ ๊ณต๋ฉ๋๋ค. ์กด์ฌํ๋ค๋ฉด ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ๊ตฌํ์ด ์ฌ์ฉ๋์ด ๋ถํ์ํ ์ค๋ฒํค๋๋ฅผ ํผํฉ๋๋ค.
์์: fetch API ๊ฐ์งํ๊ธฐ
if (!('fetch' in window)) {
// fetch๋ฅผ ์ํ ํด๋ฆฌํ
// fetch ํด๋ฆฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจ (์: whatwg-fetch)
var script = document.createElement('script');
script.src = 'https://cdnjs.cloudflare.com/ajax/libs/fetch/3.6.2/fetch.min.js';
document.head.appendChild(script);
}
์ด ์์๋ window ๊ฐ์ฒด์ fetch API๊ฐ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค. ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ, ๋์ ์ผ๋ก fetch ํด๋ฆฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ํฉ๋๋ค.
๋๋ง์ ํด๋ฆฌํ ๊ฐ๋ฐํ๊ธฐ: ๋จ๊ณ๋ณ ๊ฐ์ด๋
์์ ๋ง์ ํด๋ฆฌํ์ ๋ง๋๋ ๊ฒ์ ๋ณด๋ ์๋ ๊ฒฝํ์ด ๋ ์ ์์ผ๋ฉฐ, ํน์ ์๊ตฌ์ ๋ง๊ฒ ์๋ฃจ์ ์ ์กฐ์ ํ ์ ์์ต๋๋ค. ๋ค์์ ํด๋ฆฌํ ๊ฐ๋ฐ์ ์ํ ๋จ๊ณ๋ณ ๊ฐ์ด๋์ ๋๋ค:
1๋จ๊ณ: ๋๋ฝ๋ ๊ธฐ๋ฅ ์๋ณํ๊ธฐ
์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ํด๋ฆฌํ์ ์ ์ฉํ๋ ค๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ด๋ API๋ฅผ ์๋ณํ๋ ๊ฒ์ ๋๋ค. ECMAScript ์ฌ์์ด๋ ์ ๋ขฐํ ์ ์๋ ๋ฌธ์(์: MDN ์น ๋ฌธ์)๋ฅผ ์ฐธ์กฐํ์ฌ ํด๋น ๊ธฐ๋ฅ์ ๋์๊ณผ ์์๋๋ ์ ์ถ๋ ฅ์ ์ดํดํ์ธ์. ์ด๋ฅผ ํตํด ๋ฌด์์ ๋ง๋ค์ด์ผ ํ๋์ง ์ ํํ ํ์ ํ ์ ์์ต๋๋ค.
2๋จ๊ณ: ๊ธฐ์กด ํด๋ฆฌํ ์กฐ์ฌํ๊ธฐ
์์ ๋ง์ ํด๋ฆฌํ์ ์์ฑํ๊ธฐ ์ ์ ๊ธฐ์กด ์๋ฃจ์ ์ ์กฐ์ฌํ๋ ๊ฒ์ด ํ๋ช ํฉ๋๋ค. ์ฌ๋ฌ๋ถ์ด ๋ชฉํ๋ก ํ๋ ๊ธฐ๋ฅ์ ๋ํ ํด๋ฆฌํ์ด ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๊ธฐ์กด ํด๋ฆฌํ์ ๊ฒํ ํ๋ฉด ๊ตฌํ ์ ๋ต๊ณผ ์ ์ฌ์ ์ธ ๋ฌธ์ ์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค. ๊ธฐ์กด ํด๋ฆฌํ์ ์ฌ๋ฌ๋ถ์ ํ์์ ๋ง๊ฒ ์์ ํ๊ฑฐ๋ ํ์ฅํ ์๋ ์์ต๋๋ค.
npmjs.com์ด๋ polyfill.io์ ๊ฐ์ ๋ฆฌ์์ค๋ ๊ธฐ์กด ํด๋ฆฌํ์ ๊ฒ์ํ๊ธฐ์ ํ๋ฅญํ ๊ณณ์ ๋๋ค.
3๋จ๊ณ: ํด๋ฆฌํ ๊ตฌํํ๊ธฐ
๊ธฐ๋ฅ์ ๋ํด ๋ช ํํ๊ฒ ์ดํดํ๊ณ ๊ธฐ์กด ์๋ฃจ์ ์ ์กฐ์ฌํ๋ค๋ฉด, ์ด์ ํด๋ฆฌํ์ ๊ตฌํํ ์ฐจ๋ก์ ๋๋ค. ๋๋ฝ๋ ๊ธฐ๋ฅ์ ๋์์ ๋ณต์ ํ๋ ํจ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ๋ถํฐ ์์ํ์ธ์. ECMAScript ์ฌ์์ ์ธ์ฌํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ ํด๋ฆฌํ์ด ์์๋๋ก ๋์ํ๋์ง ํ์ธํ์ธ์. ์ฝ๋๋ ๊นจ๋ํ๊ณ ๋ฌธ์ํ๊ฐ ์ ๋์ด ์์ด์ผ ํฉ๋๋ค.
์์: String.prototype.startsWith ํด๋ฆฌํ๋งํ๊ธฐ
๋ค์์ String.prototype.startsWith ๋ฉ์๋๋ฅผ ํด๋ฆฌํํ๋ ๋ฐฉ๋ฒ์ ์์์
๋๋ค:
if (!String.prototype.startsWith) {
String.prototype.startsWith = function(searchString, position) {
position = position || 0;
return this.substr(position, searchString.length) === searchString;
};
}
์ด ํด๋ฆฌํ์ startsWith ๋ฉ์๋๊ฐ ์์ง ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ String.prototype์ ์ถ๊ฐํฉ๋๋ค. substr ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ด ์ง์ ๋ searchString์ผ๋ก ์์ํ๋์ง ํ์ธํฉ๋๋ค.
4๋จ๊ณ: ์ฒ ์ ํ๊ฒ ํ ์คํธํ๊ธฐ
ํ ์คํธ๋ ํด๋ฆฌํ ๊ฐ๋ฐ ๊ณผ์ ์์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์ ๋๋ค. ๊ตฌํ ๋ฒ์ ์ ํฌํจํ ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ์ฌ๋ฌ ํ๋ซํผ์์ ํด๋ฆฌํ์ ํ ์คํธํ์ธ์. Jest๋ Mocha์ ๊ฐ์ ์๋ํ๋ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฆฌํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๊ณ ์ด๋ ํ ํ๊ท(regression)๋ ๋ฐ์์ํค์ง ์๋์ง ํ์ธํ์ธ์.
๋ค์ ๋ธ๋ผ์ฐ์ ์์ ํด๋ฆฌํ์ ํ ์คํธํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์:
- Internet Explorer 9-11 (๋ ๊ฑฐ์ ์ง์์ฉ)
- ์ต์ ๋ฒ์ ์ Chrome, Firefox, Safari, Edge
- iOS ๋ฐ Android์ ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์
5๋จ๊ณ: ํด๋ฆฌํ ๋ฌธ์ํํ๊ธฐ
๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์๋ ๋ชจ๋ ํด๋ฆฌํ์ ํ์์ ์ ๋๋ค. ํด๋ฆฌํ์ ๋ชฉ์ , ์ฌ์ฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์๋ ค์ง ์ ํ ์ฌํญ์ ๋ฌธ์ํํ์ธ์. ํด๋ฆฌํ ์ฌ์ฉ ์์๋ฅผ ์ ๊ณตํ๊ณ ์์กด์ฑ์ด๋ ์ ์ ์กฐ๊ฑด์ ์ค๋ช ํ์ธ์. ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๋ฌธ์๋ฅผ ๋ง๋์ธ์.
6๋จ๊ณ: ํด๋ฆฌํ ๋ฐฐํฌํ๊ธฐ
ํด๋ฆฌํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ณ ๋ฌธ์ํ๊ฐ ์ ๋์๋ค๊ณ ํ์ ํ๋ฉด, ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์๊ฒ ๋ฐฐํฌํ ์ ์์ต๋๋ค. npm์ ํด๋ฆฌํ์ ๊ฒ์ํ๊ฑฐ๋ ๋ ๋ฆฝ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. polyfill.io์ ๊ฐ์ ์คํ์์ค ํ๋ก์ ํธ์ ํด๋ฆฌํ์ ๊ธฐ์ฌํ ์๋ ์์ต๋๋ค.
ํด๋ฆฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์๋น์ค
์์ ๋ง์ ํด๋ฆฌํ์ ๋ง๋๋ ๊ฒ์ด ๊ท์คํ ํ์ต ๊ฒฝํ์ด ๋ ์ ์์ง๋ง, ๊ธฐ์กด์ ํด๋ฆฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ฌํ ๋ฆฌ์์ค๋ ํ๋ก์ ํธ์ ์ฝ๊ฒ ํตํฉํ ์ ์๋ ๊ด๋ฒ์ํ ์ฌ์ ๋น๋๋ ํด๋ฆฌํ์ ์ ๊ณตํฉ๋๋ค.
polyfill.io
polyfill.io๋ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ ๋ง์ถคํ ํด๋ฆฌํ ๋ฒ๋ค์ ์ ๊ณตํ๋ ์ธ๊ธฐ ์๋ ์๋น์ค์ ๋๋ค. HTML์ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ํฌํจํ๊ธฐ๋ง ํ๋ฉด, polyfill.io๊ฐ ์๋์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ฐ์งํ๊ณ ํ์ํ ํด๋ฆฌํ๋ง ์ ๊ณตํฉ๋๋ค.
์์: polyfill.io ์ฌ์ฉํ๊ธฐ
<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
์ด ์คํฌ๋ฆฝํธ ํ๊ทธ๋ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์์ ES6 ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ํด๋ฆฌํ์ ๊ฐ์ ธ์ต๋๋ค. features ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉ์ ์ ์ํ์ฌ ํ์ํ ํด๋ฆฌํ์ ์ง์ ํ ์ ์์ต๋๋ค.
Core-js
Core-js๋ ๋ชจ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ต์ ๋ฒ์ ๊น์ง์ ECMAScript์ ๋ํ ํด๋ฆฌํ์ ์ ๊ณตํฉ๋๋ค. Babel ๋ฐ ๊ธฐํ ์ฌ๋ฌ ํธ๋์คํ์ผ๋ฌ์์ ์ฌ์ฉ๋ฉ๋๋ค.
Modernizr
Modernizr๋ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ HTML5 ๋ฐ CSS3 ๊ธฐ๋ฅ์ ๊ฐ์งํ๋ ๋ฐ ๋์์ ์ฃผ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์์ฒด์ ์ผ๋ก ํด๋ฆฌํ์ ์ ๊ณตํ์ง๋ ์์ง๋ง, ๊ธฐ๋ฅ ๊ฐ์ง์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ๋ก ํด๋ฆฌํ์ ์ ์ฉํ๊ธฐ ์ํด ํจ๊ป ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
ํด๋ฆฌํ ๊ฐ๋ฐ ๋ฐ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ต์ ์ ์ฑ๋ฅ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋ณด์ฅํ๋ ค๋ฉด, ํด๋ฆฌํ์ ๊ฐ๋ฐํ๊ณ ์ฌ์ฉํ ๋ ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ธ์:
- ๊ธฐ๋ฅ ๊ฐ์ง ์ฌ์ฉ: ๋ถํ์ํ๊ฒ ํด๋ฆฌํ์ ์ ์ฉํ์ง ์๋๋ก ํญ์ ๊ธฐ๋ฅ ๊ฐ์ง๋ฅผ ์ฌ์ฉํ์ธ์. ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฏธ ๊ธฐ๋ฅ์ ์ง์ํ๋๋ฐ ํด๋ฆฌํ์ ์ ์ฉํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
- ์กฐ๊ฑด๋ถ๋ก ํด๋ฆฌํ ๋ก๋: ํ์ํ ๋๋ง ํด๋ฆฌํ์ ๋ก๋ํ์ธ์. ์กฐ๊ฑด๋ถ ๋ก๋ฉ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ์ ๋ฐฉ์งํ์ธ์.
- ํด๋ฆฌํ ์๋น์ค ์ฌ์ฉ: polyfill.io์ ๊ฐ์ ํด๋ฆฌํ ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ ํ์ํ ํด๋ฆฌํ์ ์๋์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ์ฒ ์ ํ ํ ์คํธ: ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ํ๋ซํผ์์ ํด๋ฆฌํ์ ํ ์คํธํ์ฌ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ์ธ์.
- ํด๋ฆฌํ ์ต์ ์ํ ์ ์ง: ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ ํด๋ฆฌํ์ด ์ธ๋ชจ์์ด์ง๊ฑฐ๋ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์ ์์ต๋๋ค. ํด๋ฆฌํ์ ํจ๊ณผ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ต์ ์ํ๋ก ์ ์งํ์ธ์.
- ํด๋ฆฌํ ํฌ๊ธฐ ์ต์ํ: ํด๋ฆฌํ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ์ ์ฒด ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค. ๋ถํ์ํ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ํด๋ฆฌํ์ ํฌ๊ธฐ๋ฅผ ์ต์ํํ์ธ์.
- ํธ๋์คํ์ผ๋ง ๊ณ ๋ ค: ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํธ๋์คํ์ผ๋ง(Babel๊ณผ ๊ฐ์ ๋๊ตฌ ์ฌ์ฉ)์ด ํด๋ฆฌํ๋ง๋ณด๋ค ๋ ๋์ ๋์์ด ๋ ์ ์์ต๋๋ค. ํธ๋์คํ์ผ๋ง์ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ์ด์ ๋ฒ์ ์ผ๋ก ๋ณํํฉ๋๋ค.
ํด๋ฆฌํ๊ณผ ํธ๋์คํ์ผ๋ฌ: ์ํธ ๋ณด์์ ์ธ ์ ๊ทผ ๋ฐฉ์
ํด๋ฆฌํ๊ณผ ํธ๋์คํ์ผ๋ฌ๋ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํด ์ข ์ข ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ํธ๋์คํ์ผ๋ฌ๋ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ์ด์ ๋ฒ์ ์ผ๋ก ๋ณํํฉ๋๋ค. ํด๋ฆฌํ์ ๋๋ฝ๋ ๊ธฐ๋ฅ๊ณผ API๋ฅผ ์ ๊ณตํ์ฌ ๊ณต๋ฐฑ์ ๋ฉ์๋๋ค.
์๋ฅผ ๋ค์ด, Babel์ ์ฌ์ฉํ์ฌ ES6 ์ฝ๋๋ฅผ ES5 ์ฝ๋๋ก ํธ๋์คํ์ผํ ๋ค์, ํด๋ฆฌํ์ ์ฌ์ฉํ์ฌ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋์ง ์๋ Array.from์ด๋ Promise์ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ํ ๊ตฌํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ด๋ฌํ ํธ๋์คํ์ผ๋ง๊ณผ ํด๋ฆฌํ๋ง์ ์กฐํฉ์ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ์ํ ํฌ๊ด์ ์ธ ์๋ฃจ์ ์ ์ ๊ณตํ์ฌ, ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด์๋ ๊ตฌํ ํ๊ฒฝ์์ ์ฝ๋๊ฐ ์ํํ๊ฒ ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ํด๋ฆฌํ ์๋๋ฆฌ์ค ๋ฐ ์์
๋ค์์ ํด๋ฆฌํ์ด ํ์ํ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์ ์ด๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์์์ ๋๋ค:
1. Object.assign ํด๋ฆฌํ๋งํ๊ธฐ
Object.assign์ ํ๋ ์ด์์ ์์ค ๊ฐ์ฒด์์ ๋์ ๊ฐ์ฒด๋ก ์ด๊ฑฐ ๊ฐ๋ฅํ ๋ชจ๋ ์์ฒด ์์ฑ ๊ฐ์ ๋ณต์ฌํ๋ ๋ฉ์๋์
๋๋ค. ๊ฐ์ฒด๋ฅผ ๋ณํฉํ๋ ๋ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
if (typeof Object.assign != 'function') {
// writable: true, enumerable: false, configurable: true์ฌ์ผ ํจ
Object.defineProperty(Object, "assign", {
value: function assign(target, varArgs) {
'use strict';
if (target == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var to = Object(target);
for (var index = 1; index < arguments.length; index++) {
var nextSource = arguments[index];
if (nextSource != null) {
for (var nextKey in nextSource) {
// hasOwnProperty๊ฐ ๊ฐ๋ ค์ก์ ๋์ ๋ฒ๊ทธ๋ฅผ ํผํ๊ธฐ ์ํจ
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
},
writable: true,
configurable: true
});
}
2. Promise ํด๋ฆฌํ๋งํ๊ธฐ
Promise๋ ๋น๋๊ธฐ ์์
์ ์ต์ข
์๋ฃ(๋๋ ์คํจ)๋ฅผ ๋ํ๋ด๋ ๋ด์ฅ ๊ฐ์ฒด์
๋๋ค.
es6-promise์ ๊ฐ์ ํด๋ฆฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์ Promise ๊ตฌํ์ ์ ๊ณตํ ์ ์์ต๋๋ค:
if (typeof Promise === 'undefined') {
// es6-promise ํด๋ฆฌํ ํฌํจ
var script = document.createElement('script');
script.src = 'https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.min.js';
document.head.appendChild(script);
}
3. ์ปค์คํ ์๋ฆฌ๋จผํธ(Custom Elements) ํด๋ฆฌํ๋งํ๊ธฐ
์ปค์คํ ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ ์ ๋์์ ๊ฐ์ง ์์ ๋ง์ HTML ์๋ฆฌ๋จผํธ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
@webcomponents/custom-elements ํด๋ฆฌํ์ ์ฌ์ฉํ์ฌ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ์ปค์คํ
์๋ฆฌ๋จผํธ๋ฅผ ์ง์ํ ์ ์์ต๋๋ค:
<script src="https://unpkg.com/@webcomponents/custom-elements"></script>
ํด๋ฆฌํ์ ๋ฏธ๋
๋ธ๋ผ์ฐ์ ๊ฐ ๊ณ์ํด์ ๋ฐ์ ํ๊ณ ์๋ก์ด ์น ํ์ค์ ์ฑํํจ์ ๋ฐ๋ผ, ํด๋ฆฌํ์ ํ์์ฑ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ฐ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํด๋ฆฌํ์ ๋น๋ถ๊ฐ ์น ๊ฐ๋ฐ์์๊ฒ ๊ท์คํ ๋๊ตฌ๋ก ๋จ์ ๊ฒ์ด๋ฉฐ, ํนํ ๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๊ฑฐ๋ ์์ง ๋๋ฆฌ ์ง์๋์ง ์๋ ์ต์ฒจ๋จ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
์น ํ์ค์ ๋ฐ์ ๊ณผ ์๋ฒ๊ทธ๋ฆฐ ๋ธ๋ผ์ฐ์ (์๋์ผ๋ก ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋๋ ๋ธ๋ผ์ฐ์ )์ ์ฑํ ์ฆ๊ฐ๋ ์ ์ฐจ์ ์ผ๋ก ํด๋ฆฌํ์ ๋ํ ์์กด๋๋ฅผ ์ค์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ต์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ ๋๊น์ง, ํด๋ฆฌํ์ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ๋ณด์ฅํ๊ณ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๊ณ์ํด์ ์ค์ํ ์ญํ ์ ํ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ํด๋ฆฌํ์ ์น ๊ฐ๋ฐ์์ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ๋ฐ ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๊ทธ ๋ชฉ์ , ๊ฐ๋ฐ ๊ธฐ์ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ ๊ฒฌ๊ณ ํ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์์ ๋ง์ ํด๋ฆฌํ์ ๊ฐ๋ฐํ๋ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ , ํด๋ฆฌํ์ ์น ๊ฐ๋ฐ ๋ฌด๊ธฐ๊ณ ์์ ๊ณ์ํด์ ๊ท์คํ ๋๊ตฌ๊ฐ ๋ ๊ฒ์ ๋๋ค. ์งํํ๋ ์น ํ์ค ๋ฐ ๋ธ๋ผ์ฐ์ ์ง์ ํ๊ฒฝ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์งํ๋ ๊ฒ์ ํด๋ฆฌํ์ ์ธ์ ์ด๋ป๊ฒ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ง์ ๋ํ ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์น ํ๋ซํผ ํธํ์ฑ์ ๋ณต์ก์ฑ์ ํ์ํ ๋, ํด๋ฆฌํ์ด ๋ชจ๋ ํ๊ฒฝ์์ ์ผ๊ด๋๊ณ ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ์์ด ์ฌ๋ฌ๋ถ์ ๋๋งน์ด๋ผ๋ ์ ์ ๊ธฐ์ตํ์ธ์. ์ด๋ฅผ ๋ฐ์๋ค์ด๊ณ , ๋ง์คํฐํ์ฌ, ๋ค์ํ๊ณ ์ญ๋์ ์ธ ์ธํฐ๋ท ์ธ๊ณ์์ ์ฌ๋ฌ๋ถ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฒ์ฐฝํ๋ ๊ฒ์ ์ง์ผ๋ณด์ธ์.